/**
 * Classe Epitopo
 *
 * Essa classe define as informações que definem um epitopo
 */
package epibot.EstruturasBiologicas;

import java.text.DecimalFormat;

/**
 *
 * @author Rafael Tosta
 */
public class Epitopo {

    /**
     * Nome do epiopo
     */
    private String nomeEpitopo;
    /**
     * Posição do epitopo na proteina
     */
    private int posicao;
    /**
     * Rank do epitopo definido pelo site
     */
    private double scoreAbsoluto;
    /**
     * Armazena a referencia da sua proteina
     */
    private Proteina proteina;
    /**
     * Armazena ao rank relativo do epitopo
     */
    private double scoreRelativo;
    private int rank;
    private String alelo;

    /**
     * Construtor
     *
     * @param nome Nome do epitopo
     * @param posicao Posicao do epitopo na proteina
     * @param scoreAbsoluto Score Absoluto
     * @param proteina Código da proteína
     */
    public Epitopo(String nome, int posicao, double scoreAbsoluto, Proteina proteina) {
        this.nomeEpitopo = nome;
        this.posicao = posicao;
        this.proteina = proteina;
        this.scoreAbsoluto = scoreAbsoluto;
        this.scoreRelativo = -1.0;
    }

    public Epitopo(String epitopo, int posicao, double scoreAbsoluto, int rank, Proteina p) {
        this.nomeEpitopo = epitopo;
        this.posicao = posicao;
        this.proteina = p;
        this.scoreAbsoluto = scoreAbsoluto;
        this.scoreRelativo = -1.0;
        this.rank = rank;
    }

    public Epitopo(String epitopo, int posicao, double scoreAbsoluto, int rank, Proteina p, String alelo) {
        this.nomeEpitopo = epitopo;
        this.posicao = posicao;
        this.proteina = p;
        this.scoreAbsoluto = scoreAbsoluto;
        this.scoreRelativo = -1.0;
        this.rank = rank;
        this.alelo = alelo;
    }

    /**
     * Retorna a informações concatenas do epitopo para a gravacao em arquivo
     *
     * @return Retorna as informações concatenadas em apenas uma string
     */
    public String getInformacao() {
        return nomeEpitopo + "," + posicao + "," + this.scoreAbsoluto + "," + this.getScoreNormalizado()
                + "," + this.proteina.getSite() + "," + this.proteina.getAlelo() + ","
                + this.proteina.getTamanho() + "," + proteina.getCodProteina();
    }

    public String getInformacaoDois() {
        return rank + "," + nomeEpitopo + "," + posicao + "," + this.scoreAbsoluto;
    }

    public String getInformacaoTres() {
        return rank + "," +nomeEpitopo + "," + posicao + "," + this.scoreAbsoluto + "," + getAlelo() + ","
                + nomeEpitopo.length() + "," + proteina.getCodProteina();
    }

    public String getAlelo() {
        return alelo;
    }

    public void setProteina(Proteina proteina) {
        this.proteina = proteina;
    }

    /**
     * Retorna o nome do epítopo
     *
     * @return Nome do epitopo
     */
    public String getNomeEpitopo() {
        return nomeEpitopo;
    }

    /**
     * Retorna a posição
     *
     * @return posicao
     */
    public int getPosicaoNaProteina() {
        return posicao;
    }

    /**
     * Retorna o Código da proteina
     *
     * @return Código da proteina
     */
    public Proteina getProteina() {
        return proteina;
    }

    /**
     * Atribui o valor de score maximo e minimo da lista de epitopos
     *
     * @param maxScore Máximo score dos epitopos
     * @param minScore Mínimo score dos epitopos
     */
    public void setMaxMinProteina(Double maxScore, Double minScore) {
        this.proteina.setMaxMinScore(maxScore, minScore);

    }

    /**
     * Retorna o valor do score Absoluto
     *
     * @return Score Absoluto
     */
    public double getScoreAbsoluto() {
        return this.scoreAbsoluto;
    }

    /**
     * Retorna o valor do score normalizado que é entre 0 e 1
     *
     * @return Score Relativo
     */
    public double getScoreNormalizado() {

        if (this.proteina.getMaxScore() == 0 && this.proteina.getMinScore() == 0) {
            return 0.0;
        }

        if (this.scoreRelativo == -1.0) {
            double temp = (this.scoreAbsoluto - this.proteina.getMinScore())
                    / (this.proteina.getMaxScore() - this.proteina.getMinScore());
            DecimalFormat formatador = new DecimalFormat("###0.000");
            String s = formatador.format(temp);

            s = s.replace(',', '.');

            this.scoreRelativo = Double.parseDouble(s);
        }

        return this.scoreRelativo;
    }

    public int getRank() {
        return rank;
    }

    public int getPosicao() {
        return posicao;
    }

    public void setRank(int rank) {
        this.rank = rank;
    }
}
